package cn.yaboya.filter;

import com.alibaba.fastjson.JSON;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;

/**
 * @Author: LT
 * @CreateTime: 2022-07-31  10:56
 * @Description: 自定义zuul拦截器
 */
@Component
public class CustomFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
                /*
        如果请求的是注册(....../register)
                 登录(..../login)
                 公共静态资源(..../static/....)
        那么是不做拦截的

        1.先要想办法拿到用户的请求路径
        2.判断路径地址  如果是上面三个的请求  那么返回false
         */
        // 获取到请求地址
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        String uri = request.getRequestURI();
        if (uri.endsWith("/register")||uri.endsWith("/login")||uri.contains("static")){
            return false;
        }

        return true;
    }

    /**
    * @Title: run
    * @Description:
     *如果用户的请求中  header里  没有token(token 为空也要拦截)
     *那么  这个请求需要被拦截并且返回错误信息
     *如果token 正确那么放行  正常访问
     *1.拿到header(在request里面)
     *2.从header里面那token
     *3.判断token
     *    3.1是否为空
     *    3.2是否正确(在这里  因为没有办法判断 所以省略)
     *4.如果token有问题
     *    4.1 先要拿到response
     *    4.2 把返回的信息写到response
     *    4.3 拦截
     *5. 如果没有问题  那么放行
     *
    * @Author: LT
    * @Version: 1.0
    * @Date:  2022/7/31 21:41
    * @Parameters: []
    * @Return java.lang.Object
    */
    @Override
    public Object run() throws ZuulException {
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        HttpServletResponse response = RequestContext.getCurrentContext().getResponse();
        String token = request.getHeader("token");

        //如果token有问题

        if (StringUtils.isBlank(token) && !tokenIsTrue(token)){
            HashMap<String, Object> map = new HashMap<>();
            map.put("success", false);
            map.put("message", "登录信息不正确");
            map.put("code", 402);
            map.put("data", null);

            String str = JSON.toJSONString(map);
            response.setStatus(402);


            //将返回数据写入到response
            try {
                response.getWriter().write(str);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //拦截   固定使用方式
            RequestContext.getCurrentContext().setSendZuulResponse(false);

        }
        //执行到这里  就放行了   返回值  不用管
        return null;

    }

    private Boolean tokenIsTrue(String token){
        return false;
    }


    /**
    * @Title: main
    * @Description:  empty  不判断空格
    * @Author: LT
    * @Version: 1.0
    * @Date:  2022/7/31 21:53
    * @Parameters: [args]
    * @Return void
    */
    public static void main(String[] args) {
        String s = "  ";
        System.out.println(StringUtils.isEmpty(s));
        System.out.println(StringUtils.isBlank(s));
    }

}
